#include <stdio.h>
#include <stdlib.h>
#include "TableRoutage.h"


TableRoutage::TableRoutage(int idRouteur, int nbRouteur) {
	this->idRouteur = idRouteur;
    this->nbRouteur = nbRouteur;
}


TableRoutage::~TableRoutage() {}


void TableRoutage::ajouteDestination(int numRouteurDest,int numRouteurPassage, int coutLiaison) {
    
    if(numRouteurDest != idRouteur){
        if (this->table.count(numRouteurDest) != 0)
            this->modifierDestination(numRouteurDest, numRouteurPassage, coutLiaison);
        else
            this->table[numRouteurDest]= *new Destination(numRouteurPassage, coutLiaison);
    }
}


void TableRoutage::modifierDestination(int numRouteurDest, int numRouteurPassage, int coutLiaison) {
    
    if(this->table[numRouteurDest].getCoutLiaison() > coutLiaison)
        this->table[numRouteurDest]= *new Destination(numRouteurPassage, coutLiaison);
}

void TableRoutage::forceModifierDestination(int numRouteurDest, int numRouteurPassage, int coutLiaison) {
        this->table[numRouteurDest]= *new Destination(numRouteurPassage, coutLiaison);
}


void TableRoutage::toString(char* s) {
    
	for (map<int,Destination>::iterator it = this->table.begin(); it != this->table.end(); it++) {
        char destString[2048];
        it->second.toString(destString);
        int sommetDest = it->first;
		sprintf(s, "%s%d:%s-", s, sommetDest, destString);
        
	}
}


void TableRoutage::afficher() {
	cout << endl << endl << "Taille de la table de routage: " << table.size() << endl;
    cout << " Routeur destination | Routeur intermediare | Cout " << endl;
    cout << "---------------------------------------------------" << endl;
    
	for (map<int,Destination>::iterator it = this->table.begin(); it != this->table.end(); it++) {
        if (it->first < 10) {
            cout << "          " << it->first << "          |";            
        }
        else if (it->first < 100) {
            cout << "         " << it->first << "          |"; 
        }
        else if (it->first < 1000) {
            cout << "         " << it->first << "         |"; 
        }
        
        if (it->second.getNumRouteur() < 10) {
            cout << "          " << it->second.getNumRouteur() << "           |";
        }
        else if (it->second.getNumRouteur() < 100) {
            cout << "         " << it->second.getNumRouteur() << "           |";
        }
        else if (it->second.getNumRouteur() < 1000) {
            cout << "         " << it->second.getNumRouteur() << "          |";
        }
        
        cout << "   " << it->second.getCoutLiaison() << endl;
	}
}



map<int,Destination> TableRoutage::getTable() {
	return this->table;
}


int TableRoutage::getRouteurPassage(int routeurDestination) {
    return table[routeurDestination].getNumRouteur();
}

